package cn.qyd.atomic;

import cn.qyd.common.User;
import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * @author 邱运铎
 * @date 2024-03-25 9:02
 */
public class UnsafeClassStatic {
    private static String name = "qiuyundo";
    private int age;

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Unsafe unsafe = UnsafeDemo01.getUnsafe();
        //如果一个类没有被实例化，那么他的静态属性也不会被初始化，最后获得的属性将是null,例如删除下面的创建demo语句，object 为null
        //下面这个因为是使用当前的类，所以在main方法启动时类已经加载，对应的static 属性值已经被初始化，所以在注释掉创建对象语句依然还有值
//        UnsafeClassStatic demo = new UnsafeClassStatic();
        //使用其他包下面的类来进行实验即可
//        User user = new User();
        System.out.println(unsafe.shouldBeInitialized(User.class));
        //注意这里使用使用不同的类需要记得修改这里获得字段的类名称
        Field field = User.class.getDeclaredField("name");
        Object fieldBase = unsafe.staticFieldBase(field);
        long fieldOffset = unsafe.staticFieldOffset(field);
        Object object = unsafe.getObject(fieldBase, fieldOffset);
        System.out.println(object);
    }
}
